Tokenomics and Simulation Report: Antigravity¶
Introduction¶
This report presents the simulation of Dark tokenomics and its various components, including the Journey Phase Manager, Treasury, Jackpot, and Pool modules. The simulation tracks the evolution of the Dark token price, NFT minting, and yield distribution across 33 journeys.
The objective of this report is to provide a comprehensive overview of the system's behavior and key metrics through detailed graphs and data accumulation.
Table of Contents¶
Need for project like Antigravity?¶
Crypto needs a project that pushes the innovation of NFTs. This us an experiment in capturing and concentrating economic energy through tokenomics and defi.
Introduction of Antigravity¶
Antigravity is the most dynamic story and set of tokenomics folded into a single project.
Goal of Antigravity and Impact Antigravity will make¶
The goal of agproject.io is to create the best community in crypto hands down. We hope to break the 4 year bull and bear cycle.
What is $DARK?¶
'$Dark' is a PRC20 token with a total supply of 1M tokens, no inflation and programmed scarcity. It is also the only token used to mint Fuel Cell NFTs.
Components of Antigravity¶
The 3 components of Antigravity are it's story and art inspired by "Rings of Dust". The $Dark Matter Token, and the Fuel Cell NFT.
How FuelCells work?¶
The Fuel Cell NFT is minted on a 1 to 1 ratio of the $Dark Matter token and has a limit of 1M. Users have 33 chances to mint the Fuel Cell NFTs and a 15 day window to mint each series. The Fuel Cell NFT also has 3 features: the Art from "Rings of Dust", the treasury yield paid every 105 days, and the lottery giveaways that take place in the 90 days following the minting phase.
How is yield generated¶
Yield is generated from the minting of Fuel Cells. 77% of the $Dark Matter tokens that are used in minting fund the treasury. The treasury pays yield every 105 days into the Fuel Cell NFTs. The yeild can only be collected by breaking open the Fuel Cell NFT. Once the Fuel Cell NFT is broken open (unwrapped) it no longer receives yield from the treasury. Unbroken Fuel Cell NFTs receive yield from the treasury every 105 days.
How Jackpot works?¶
20% of the $Dark Mater tokens used in minting go to funding the Jackpot address. When users mint a Fuel Cell NFT they're automatically entered into 3 drawings of the lottery that take place during the following 90 days.
How will Evil Address operate?¶
The Evil Address has an unfair advantage in the Antgravity game. Not only does the Evil Adress receive the majority of $Dark Matter tokens (65%), but it also seeks to mint as many Fuel Cell NFTs as possible. By doing this the Evil Address hopes to hoard as many $Dark Matter tokens from winning lotteries and collecting yield from the treasury.
Benefits of Evil Address to holders of $DARK and FuelCells?¶
The competitive nature of the Evil Address does remove the supply of $Dark Matter from the market. This may increase demand for the tokens.
How is supply crisis created¶
Supply crises my arrise from the Evil Address hoarding tokens and NFTs, minting of the Fuel Cell NFTs, limited minting windows, limited minting time periods, fomo of getting into the next lotteries and an event called "The Rapture" where all unutilized $Dark Matter tokens will be destroyed and removed from supply following the final (33rd) minting phase
Tokenomics Simulations¶
# Import necessary packages and modules
# General packages
import numpy as np
import random
import sys
import os
project_root = os.path.abspath(os.path.join(os.getcwd(), '..'))
if project_root not in sys.path:
sys.path.append(project_root)
import plotly.graph_objects as go
import pandas as pd
from plotly.subplots import make_subplots
from constants.constants import exports_dir
# Import custom modules
from modules.Account import Account
from modules.Dark import DarkToken
from modules.FuelCells import FuelCellsToken
from modules.JourneyPhaseManager import JourneyPhaseManager
from modules.Treasury import Treasury
from modules.LaunchControlCenter import LaunchControlCenter
from modules.EvilAddress import EvilAddress
from modules.Jackpot import Jackpot
from modules.Pool import Pool
from modules.Team import Team
from modules.DAIStableCoin import DAIStableCoin
import plotly.io as pio
# This ensures Plotly output works in multiple places:
# plotly_mimetype: VS Code notebook UI
# notebook: "Jupyter: Export to HTML" command in VS Code
# See https://plotly.com/python/renderers/#multiple-renderers
pio.renderers.default = "plotly_mimetype+notebook"
# Set up initial configurations for the simulation
np.random.seed(42)
random.seed(42)
Initialize accounts¶
# Import necessary packages and modules
# Initialize Accounts
# Public account
public_account = Account()
# MagicBox account managed by the team
magic_box_account = Account()
# Dead account
dead_account = Account()
# Team account to collect share of Dark tokens used to mint NFTs
team_account = Team()
# Initialize Dark token
dark_token = DarkToken()
# Mint initial Dark token supply to Public, MagicBox, and Evil address
initial_dark_supply = 1000000 # Total initial supply
public_initial_balance = int(initial_dark_supply * 0.10)
magic_box_initial_balance = int(initial_dark_supply * 0.25)
evil_address_initial_balance = int(initial_dark_supply * 0.65)
dark_token.mint(public_account, public_initial_balance)
dark_token.mint(magic_box_account, magic_box_initial_balance)
# Initialize FuelCells token
fuel_cells_token = FuelCellsToken()
# Initialize JourneyPhaseManager
journey_phase_manager = JourneyPhaseManager()
# Initialize Treasury
treasury_account = Account()
treasury = Treasury(treasury_account, dark_token)
# Initialize Jackpot
jackpot_account = Account()
jackpot = Jackpot(jackpot_account, dark_token, journey_phase_manager, fuel_cells_token)
# Initialize LaunchControlCenter
lcc = LaunchControlCenter(dark_token, fuel_cells_token, treasury_account, jackpot_account, team_account, journey_phase_manager)
# Initialize EvilAddress
evil_address_account = EvilAddress(dark_token, fuel_cells_token, lcc, journey_phase_manager, evil_address_initial_balance)
dark_token.mint(evil_address_account, evil_address_initial_balance)
# Initialize Pool
dai_token = DAIStableCoin()
pool = Pool(dark_token, dai_token)
# Initialize accounts and variables summary
print("Initial Balances:")
print(f"Public Account: {dark_token.balance_of(public_account)} Dark tokens")
print(f"Treasury Contract Balance: {dark_token.balance_of(treasury_account)} Dark tokens")
print(f"Jackpot Contract Balance: {dark_token.balance_of(jackpot_account)} Dark tokens")
print(f"MagicBox Account: {dark_token.balance_of(magic_box_account)} Dark tokens")
print(f"Evil Address Contract Balance: {dark_token.balance_of(evil_address_account)} Dark tokens")
print(f"Team Account: {dark_token.balance_of(team_account)} Dark tokens")
Initial Balances: Public Account: 100000 Dark tokens Treasury Contract Balance: 0 Dark tokens Jackpot Contract Balance: 0 Dark tokens MagicBox Account: 250000 Dark tokens Evil Address Contract Balance: 650000 Dark tokens Team Account: 0 Dark tokens
Data Storage and Helper Functions¶
# Initialize data storage
prices = []
volumes = []
nfts_minted = [] # total NFTs minted
nfts_minted_per_journey = [] # NFTS minted in each journey
evil_address_balances = []
yields_per_journey = []
cumulative_yield_per_journey_1 = []
yields_per_journey_accumulated = []
yield_per_nft_per_journey = []
pool_dark_reserves = []
pool_dai_reserves = []
token_distribution = []
# Helper function to accumulate data
def accumulate_data(journey, phase, pool, fuel_cells_token, evil_address_account, treasury, jackpot_account, treasury_account):
prices.append({
'journey': journey,
'phase': phase,
'price': pool.get_price()
})
volumes.append({
'journey': journey,
'phase': phase,
'volume': pool.total_volume
})
evil_address_balances.append({
'journey': journey,
'phase': phase,
'balance': dark_token.balance_of(evil_address_account)
})
pool_dark_reserves.append({
'journey': journey,
'phase': phase,
'dark_reserve': pool.dark_reserve
})
pool_dai_reserves.append({
'journey': journey,
'phase': phase,
'dai_reserve': pool.dai_reserve
})
token_distribution.append({
'journey': journey,
'phase': phase,
'public_balance': dark_token.balance_of(public_account),
'magic_box_balance': dark_token.balance_of(magic_box_account),
'evil_address_balance': dark_token.balance_of(evil_address_account),
'team_balance': dark_token.balance_of(team_account),
'treasury_balance': dark_token.balance_of(treasury_account) - treasury.total_yield_distributed,
'jackpot_balance': dark_token.balance_of(jackpot_account),
'pool_balance': pool.dark_reserve,
'yield_balance': treasury.total_yield_distributed
})
if phase == 3 and journey > 0:
if journey <= 33:
yield_for_journey = treasury.get_total_yield_for_journey(journey)
yields_per_journey.append({
'journey': journey,
'total_yield': yield_for_journey
})
nfts_minted.append({
"journey": journey,
"nfts": fuel_cells_token.total_supply
})
supplyInPreviousJourney = 0
if(nfts_minted_per_journey.__len__() != 0):
supplyInPreviousJourney = nfts_minted[journey-2]["nfts"]
nfts_minted_per_journey.append({
"journey": journey,
"nftsMinted": fuel_cells_token.total_supply - supplyInPreviousJourney
})
# Accumulate yield for NFTs minted in journey 1
cumulative_yield_per_journey_1.append({
'journey': journey,
'total_yield': (treasury.get_total_yield_for_journey(1) / journey_phase_manager.get_nft_count(1))
})
yield_per_nft_per_journey.append({
'journey': journey,
'total_yield': treasury.get_total_yield_for_journey(1)
})
# Accumulate yield for NFTs minted in previous journeys
total_yield_accumulated = treasury.total_yield_distributed
yields_per_journey_accumulated.append({
'journey': journey,
'total_yield': total_yield_accumulated
})
Initialize Liquidity Pool¶
# Initialize Liquidity Pool
# Mint initial DAI supply to MagicBox account
initial_dai_supply = 300000 # Total initial DAI supply for liquidity
dai_token.mint(magic_box_account, initial_dai_supply)
# Define liquidity amounts
dark_liquidity_amount = 100000 # Dark tokens from MagicBox balance
dai_liquidity_amount = initial_dai_supply # DAI tokens
# Add liquidity to the pool from MagicBox
pool.add_liquidity(magic_box_account, dark_liquidity_amount, dai_liquidity_amount)
# Print pool status after adding liquidity
print(f"Liquidity Pool Initialized:")
print(pool)
print(f"Initial DARK token price: {pool.get_price()} per DAI token")
Liquidity Pool Initialized: Pool: Dark reserve = 100000, DAI reserve = 300000, Fee = 0.003, Total volume = 0 Initial DARK token price: 3.0 per DAI token
Utility Functions¶
# Utility functions
# Helper function to simulate trades
def simulate_trades(account, pool, total_trades, buy_pressure, sell_pressure, nft_purchase_share_from_public_buy, journey_phase_manager, dai_token):
for _ in range(total_trades):
trade_type = np.random.choice(["buy", "sell"], p=[buy_pressure, sell_pressure])
if trade_type == "buy":
dai_amount = np.random.randint(10, 100) # Random DAI amount to buy Dark tokens
if dai_token.balance_of(account) < dai_amount:
dai_token.mint(account, dai_amount) # Mint DAI tokens if account has insufficient balance
if pool.dai_reserve >= dai_amount:
pool.buy(account, dai_amount)
dark_tokens_purchased = dai_amount / pool.get_price()
if journey_phase_manager.get_current_journey() <=33:
nft_purchase_amount = int(dark_tokens_purchased * nft_purchase_share_from_public_buy)
if journey_phase_manager.get_current_phase() == 1 and dark_tokens_purchased >= nft_purchase_amount:
# print(f"Minting more FUEL_CELLS from ${account.address}. Amount: {nft_purchase_amount}")
lcc.mint_nft(account, nft_purchase_amount)
else:
dark_amount = np.random.randint(10, 100) # Random Dark amount to sell for DAI
if dark_token.balance_of(account) >= dark_amount and pool.dark_reserve >= dark_amount:
pool.sell(account, dark_amount)
Variables¶
# Variables for controlling buy/sell pressures and trades
buy_pressure = 0.6 # 60% of the trades will be buys
sell_pressure = 0.4 # 40% of the trades will be sells
total_trades = 10000 # Total number of trades in the journey
nft_purchase_share_from_public_buy = 0.3 # 30% of the Dark tokens from buys will be used for minting NFTs
public_nft_mint_percentage = 0.10 # 10% of the public Dark token balance will be used to mint NFTs
public_re_mint_from_lottery_percentage = 0.10 # 10% of the lottery winnings will be used to mint NFTs again
# Initial pool status
initial_dark_reserve = pool.dark_reserve
initial_dai_reserve = pool.dai_reserve
initial_price = pool.get_price()
print(f"Initial Dark reserve: {initial_dark_reserve}")
print(f"Initial DAI reserve: {initial_dai_reserve}")
print(f"Initial Dark token price: {initial_price}")
print(f"Buy Probability: {buy_pressure}")
print(f"Sell Probability: {sell_pressure}")
print(f"Total Trades per journey: {total_trades}")
print(f"% of the Dark tokens from buys will be used for minting NFTs: {nft_purchase_share_from_public_buy}")
print(f"% of the public Dark token balance will be used to mint NFTs: {public_nft_mint_percentage}")
print(f"% of the lottery winnings will be used to mint NFTs again: {public_re_mint_from_lottery_percentage}")
Initial Dark reserve: 100000 Initial DAI reserve: 300000 Initial Dark token price: 3.0 Buy Probability: 0.6 Sell Probability: 0.4 Total Trades per journey: 10000 % of the Dark tokens from buys will be used for minting NFTs: 0.3 % of the public Dark token balance will be used to mint NFTs: 0.1 % of the lottery winnings will be used to mint NFTs again: 0.1
Run through the journeys¶
# # Journey 1 Simulation
# # Simulate the minting phase
# public_initial_balance = dark_token.balance_of(public_account)
# public_nft_mint_amount = int(public_initial_balance * public_nft_mint_percentage) # 10% of the public Dark token balance
# evil_address_nft_mint_amount = int(evil_address_account.starting_balance * evil_address_account.b * (evil_address_account.r ** (journey_phase_manager.get_current_journey() - 1)) / 100)
# # Public mints NFTs
# lcc.mint_nft(public_account, public_nft_mint_amount)
# # Evil address mints NFTs
# evil_address_account.mint_fuel_cells()
# # Update phase to lottery phase
# journey_phase_manager.increment_phase()
# # Capture the jackpot balance before the lottery
# initial_jackpot_balance = dark_token.balance_of(jackpot.account)
# # Conduct the lottery
# lottery_result = jackpot.conduct_lottery()
# print(lottery_result)
# # Total lottery payouts
# total_lottery_payouts = sum(jackpot.calculate_payouts(journey_phase_manager.get_current_journey(), initial_jackpot_balance))
# print(f"Total lottery payouts: {total_lottery_payouts}")
# # Public sells all their lottery winnings
# lottery_winnings = jackpot.get_lottery_winnings(journey_phase_manager.get_current_journey(), public_account)
# if lottery_winnings > 0:
# pool.sell(public_account, lottery_winnings)
# print(f"Total lottery winnings for public: {lottery_winnings}")
# # Simulate trades in Phase 1
# phase_1_trades = int(total_trades * 0.3) # 30% of the trades in Phase 1
# simulate_trades(public_account, pool, phase_1_trades, buy_pressure, sell_pressure, nft_purchase_share_from_public_buy, journey_phase_manager, dai_token)
# print(f"Total volume in Pool at end of Phase 1: {pool.total_volume}")
# # Update phase to yield distribution
# journey_phase_manager.increment_phase()
# # Simulate trades in Phase 2
# phase_2_trades = int(total_trades * 0.5) # 50% of the trades in Phase 2
# simulate_trades(public_account, pool, phase_2_trades, buy_pressure, sell_pressure, nft_purchase_share_from_public_buy, journey_phase_manager, dai_token)
# print(f"Total volume in Pool at end of Phase 2: {pool.total_volume}")
# # Update phase to next journey
# journey_phase_manager.increment_phase()
# # Simulate trades in Phase 3
# phase_3_trades = total_trades - (phase_1_trades + phase_2_trades) # Remaining trades in Phase 3
# simulate_trades(public_account, pool, phase_3_trades, buy_pressure, sell_pressure, nft_purchase_share_from_public_buy, journey_phase_manager, dai_token)
# print(f"Total volume in Pool at end of Phase 3: {pool.total_volume}")
# # Distribute yield to NFT holders
# treasury.distribute_yield(journey_phase_manager)
# # Calculate the total yield given by the treasury
# total_yield_given = treasury.total_yield_distributed
# print(f"Total yield given by the treasury in Journey 1: {total_yield_given}")
# # Calculate the yield per NFT for public and evil address
# public_nft_count = fuel_cells_token.balance_of(public_account)
# evil_nft_count = fuel_cells_token.balance_of(evil_address_account)
# total_nft_count = public_nft_count + evil_nft_count
# yield_per_nft = total_yield_given / total_nft_count if total_nft_count else 0
# print(f"Total yield per NFT: {yield_per_nft}")
# # Final pool status
# final_dark_reserve = pool.dark_reserve
# final_dai_reserve = pool.dai_reserve
# final_price = pool.get_price()
# print(f"Final Dark reserve: {final_dark_reserve}")
# print(f"Final DAI reserve: {final_dai_reserve}")
# print(f"Final Dark token price: {final_price}")
# # Print summary of Journey 1
# print("Journey 1 Summary:")
# print(f"Public Account: {fuel_cells_token.balance_of(public_account)} FuelCells NFTs")
# print(f"Evil Address Account: {fuel_cells_token.balance_of(evil_address_account)} FuelCells NFTs")
# print(f"Treasury Balance: {dark_token.balance_of(treasury_account)} Dark tokens")
# print(f"Jackpot Balance: {dark_token.balance_of(jackpot_account)} Dark tokens")
# print(f"Pool: {pool}")
# print(f"Total trades: {total_trades}")
# print(f"Buy pressure: {buy_pressure * 100}%")
# print(f"Sell pressure: {sell_pressure * 100}%")
# print(f"Total lottery winnings per winner: {lottery_winnings / total_trades if total_trades else 0}")
# print(f"Total volume in Pool: {pool.total_volume}")
# # Move to next journey
# journey_phase_manager.increment_phase()
Simualte for 50 journeys¶
# Simulate 33 Journeys with data accumulation
accumulate_data(0, 1, pool, fuel_cells_token, evil_address_account, treasury, jackpot_account, treasury_account)
accumulate_data(0, 2, pool, fuel_cells_token, evil_address_account, treasury, jackpot_account, treasury_account)
accumulate_data(0, 3, pool, fuel_cells_token, evil_address_account, treasury, jackpot_account, treasury_account)
evilPercentages = []
totalNftsMintedValue = 0
nftsMintedInEachJourneyValue = 0
totalNFTsMinted = []
nftsMintedInEachJourney = []
treasuryBalance = []
for journey in range(1, 51):
if journey<=33:
print()
print(f"Simulating Journey {journey}")
# Phase 1: Minting Phase
public_initial_balance = dark_token.balance_of(public_account)
public_nft_mint_amount = int(public_initial_balance * public_nft_mint_percentage) # 10% of the public Dark token balance
# Public mints NFTs
lcc.mint_nft(public_account, public_nft_mint_amount)
print(f"Public mints NFTs using: {public_nft_mint_amount} in journey {journey}, fuel cells balance: {fuel_cells_token.balance_of(public_account)}")
# Evil address mints NFTs
evil_address_account.mint_fuel_cells()
# Simulate trades in Phase 1
phase_1_trades = int(total_trades * 0.3) # 30% of the trades in Phase 1
simulate_trades(public_account, pool, phase_1_trades, buy_pressure, sell_pressure, nft_purchase_share_from_public_buy, journey_phase_manager, dai_token)
print(f"Total volume in Pool at end of Phase 1: {pool.total_volume}")
# Accumulate data at the end of Phase 1
accumulate_data(journey, 1, pool, fuel_cells_token, evil_address_account, treasury, jackpot_account, treasury_account)
totalNftsMintedValue += fuel_cells_token.total_supply
nftsMintedInEachJourneyValue = fuel_cells_token.total_supply - nftsMintedInEachJourneyValue
totalNFTsMinted.append(totalNftsMintedValue)
nftsMintedInEachJourney.append(nftsMintedInEachJourneyValue)
# Increment to Phase 2
journey_phase_manager.increment_phase()
# Phase 2: Lottery Phase
# Capture the jackpot balance before the lottery
initial_jackpot_balance = dark_token.balance_of(jackpot.account)
# Conduct the lottery
lottery_result = jackpot.conduct_lottery()
print(lottery_result)
evil_address_jackpot_winning = jackpot.get_lottery_winnings(journey, evil_address_account)
print(f"Evil Address lottery winning: {evil_address_jackpot_winning}")
# Total lottery payouts
total_lottery_payouts = sum(jackpot.calculate_payouts(journey_phase_manager.get_current_journey(), initial_jackpot_balance))
# print(f"Total lottery payouts: {total_lottery_payouts}")
# Public sells all their lottery winnings
lottery_winnings = jackpot.get_lottery_winnings(journey_phase_manager.get_current_journey(), public_account)
# 10% of the lottery winnings by public will be used to mint NFTs again in next journey
tokens_to_be_sold = lottery_winnings * (1 - public_re_mint_from_lottery_percentage)
if tokens_to_be_sold > 0:
pool.sell(public_account, tokens_to_be_sold)
print(f"Total lottery winnings for public: {lottery_winnings}")
print(f"Total lottery winnings sold by public: {tokens_to_be_sold}")
# Simulate trades in Phase 2
phase_2_trades = int(total_trades * 0.5) # 50% of the trades in Phase 2
simulate_trades(public_account, pool, phase_2_trades, buy_pressure, sell_pressure, nft_purchase_share_from_public_buy, journey_phase_manager, dai_token)
# print(f"Total volume in Pool at end of Phase 2: {pool.total_volume}")
# Accumulate data at the end of Phase 2
accumulate_data(journey, 2, pool, fuel_cells_token, evil_address_account, treasury, jackpot_account, treasury_account)
# Increment to Phase 3
journey_phase_manager.increment_phase()
# transfer 3% to the team from recent evil address win
team_tax_from_ea = evil_address_jackpot_winning * 0.03
dark_token.transfer(evil_address_account, team_account, team_tax_from_ea)
# transfer remaning winning to jackpot
dark_token.transfer(evil_address_account, jackpot_account, evil_address_jackpot_winning - team_tax_from_ea)
# Phase 3: Yield Distribution Phase
# Simulate trades in Phase 3
phase_3_trades = total_trades - (phase_1_trades + phase_2_trades) # Remaining trades in Phase 3
simulate_trades(public_account, pool, phase_3_trades, buy_pressure, sell_pressure, nft_purchase_share_from_public_buy, journey_phase_manager, dai_token)
# print(f"Total volume in Pool at end of Phase 3: {pool.total_volume}")
# Distribute yield to NFT holders
treasury.distribute_yield(journey_phase_manager)
# Accumulate data at the end of Phase 3
accumulate_data(journey, 3, pool, fuel_cells_token, evil_address_account, treasury, jackpot_account, treasury_account)
# Increment to next journey (Phase 1 of the new journey)
if journey == 33:
dark_token.transfer(public_account, dead_account, dark_token.balance_of(public_account))
journey_phase_manager.increment_phase()
else:
# Distribute yield to NFT holders
treasury.distribute_yield(journey_phase_manager)
# print(f"Simulating Journey {journey}")
# Phase 1: Minting Phase
public_initial_balance = dark_token.balance_of(public_account)
public_nft_mint_amount = int(public_initial_balance * public_nft_mint_percentage) # 10% of the public Dark token balance
# Simulate trades in Phase 1
phase_1_trades = int(total_trades * 0.3) # 30% of the trades in Phase 1
simulate_trades(public_account, pool, phase_1_trades, buy_pressure, sell_pressure, nft_purchase_share_from_public_buy, journey_phase_manager, dai_token)
# print(f"Total volume in Pool at end of Phase 1: {pool.total_volume}")
# Accumulate data at the end of Phase 1
accumulate_data(journey, 1, pool, fuel_cells_token, evil_address_account, treasury, jackpot_account, treasury_account)
totalNftsMintedValue += fuel_cells_token.total_supply
nftsMintedInEachJourneyValue = fuel_cells_token.total_supply - nftsMintedInEachJourneyValue
totalNFTsMinted.append(totalNftsMintedValue)
nftsMintedInEachJourney.append(nftsMintedInEachJourneyValue)
# Increment to Phase 2
journey_phase_manager.increment_phase()
# Simulate trades in Phase 2
phase_2_trades = int(total_trades * 0.5) # 50% of the trades in Phase 2
simulate_trades(public_account, pool, phase_2_trades, buy_pressure, sell_pressure, nft_purchase_share_from_public_buy, journey_phase_manager, dai_token)
# print(f"Total volume in Pool at end of Phase 2: {pool.total_volume}")
# Accumulate data at the end of Phase 2
accumulate_data(journey, 2, pool, fuel_cells_token, evil_address_account, treasury, jackpot_account, treasury_account)
# Increment to Phase 3
journey_phase_manager.increment_phase()
# Phase 3: Yield Distribution Phase
# Simulate trades in Phase 3
phase_3_trades = total_trades - (phase_1_trades + phase_2_trades) # Remaining trades in Phase 3
simulate_trades(public_account, pool, phase_3_trades, buy_pressure, sell_pressure, nft_purchase_share_from_public_buy, journey_phase_manager, dai_token)
# print(f"Total volume in Pool at end of Phase 3: {pool.total_volume}")
# Distribute yield to NFT holders
treasury.distribute_yield(journey_phase_manager)
# Accumulate data at the end of Phase 3
accumulate_data(journey, 3, pool, fuel_cells_token, evil_address_account, treasury, jackpot_account, treasury_account)
journey_phase_manager.increment_phase()
treasuryBalance.append({
'journey': journey,
'balance': treasury.remaining_balance,
'actualBalance': dark_token.balance_of(treasury_account)
})
# totalNFTsMinted_df = pd.DataFrame(totalNFTsMinted)
# print(totalNFTsMinted_df)
# nftsMintedInEachJourney_df = pd.DataFrame(nftsMintedInEachJourney)
# print(nftsMintedInEachJourney_df)
Simulating Journey 1 Public mints NFTs using: 10000 in journey 1, fuel cells balance: 10000 Evil address mints NFTs using: 67038.0 in journey 1 Total volume in Pool at end of Phase 1: 247484.0139482396 3 Lottery conducted and 121.00413850000004 payouts distributed to total 4419 winners. Evil Address lottery winning: 91.97065594263836 Total lottery winnings for public: 29.03348255736558 Total lottery winnings sold by public: 26.130134301629024 Simulating Journey 2 Public mints NFTs using: 3783 in journey 2, fuel cells balance: 25166 Evil address mints NFTs using: 60334.0 in journey 2 Total volume in Pool at end of Phase 1: 929428.9480268111 3 Lottery conducted and 234.3967306191957 payouts distributed to total 4149 winners. Evil Address lottery winning: 173.89085004721548 Total lottery winnings for public: 60.505880571984285 Total lottery winnings sold by public: 54.45529251478586 Simulating Journey 3 Public mints NFTs using: 1346 in journey 3, fuel cells balance: 45413 Evil address mints NFTs using: 54301.0 in journey 3 Total volume in Pool at end of Phase 1: 1562610.9811098159 Simulating Journey 3 Public mints NFTs using: 1346 in journey 3, fuel cells balance: 45413 Evil address mints NFTs using: 54301.0 in journey 3 Total volume in Pool at end of Phase 1: 1562610.9811098159 3 Lottery conducted and 334.930007187133 payouts distributed to total 3687 winners. Evil Address lottery winning: 249.3190475446183 Total lottery winnings for public: 85.61095964250929 Total lottery winnings sold by public: 77.04986367825836 Simulating Journey 4 Public mints NFTs using: 55 in journey 4, fuel cells balance: 63612 Evil address mints NFTs using: 48870.0 in journey 4 Total volume in Pool at end of Phase 1: 2190613.6448038192 3 Lottery conducted and 421.8701927282475 payouts distributed to total 3198 winners. Evil Address lottery winning: 318.29659408471406 Total lottery winnings for public: 103.57359864354633 Total lottery winnings sold by public: 93.2162387791917 Simulating Journey 5 Public mints NFTs using: 20 in journey 5, fuel cells balance: 78702 Evil address mints NFTs using: 43983.0 in journey 5 Total volume in Pool at end of Phase 1: 2801575.2547139744 3 Lottery conducted and 497.1642245462136 payouts distributed to total 2778 winners. Evil Address lottery winning: 387.25426870315084 Total lottery winnings for public: 109.90995584306104 Total lottery winnings sold by public: 98.91896025875494 Simulating Journey 6 Public mints NFTs using: 9 in journey 6, fuel cells balance: 90293 Evil address mints NFTs using: 39585.0 in journey 6 Total volume in Pool at end of Phase 1: 3431909.215303904 3 Lottery conducted and 563.4233845532971 payouts distributed to total 2451 winners. Evil Address lottery winning: 449.53679029842715 Total lottery winnings for public: 113.88659425487216 Total lottery winnings sold by public: 102.49793482938495 Simulating Journey 7 Public mints NFTs using: 28 in journey 7, fuel cells balance: 99752 Evil address mints NFTs using: 35626.0 in journey 7 Total volume in Pool at end of Phase 1: 4072979.141112509 3 Lottery conducted and 622.452450367444 payouts distributed to total 2187 winners. Evil Address lottery winning: 504.865900856519 Total lottery winnings for public: 117.58654951091734 Total lottery winnings sold by public: 105.82789455982561 Simulating Journey 8 Public mints NFTs using: 7 in journey 8, fuel cells balance: 107876 Evil address mints NFTs using: 32064.0 in journey 8 Total volume in Pool at end of Phase 1: 4688402.674042588 3 Lottery conducted and 674.2479000546065 payouts distributed to total 1923 winners. Evil Address lottery winning: 567.1075495444952 Total lottery winnings for public: 107.14035051012645 Total lottery winnings sold by public: 96.42631545911381 Simulating Journey 9 Public mints NFTs using: 6 in journey 9, fuel cells balance: 114323 Evil address mints NFTs using: 28857.0 in journey 9 Total volume in Pool at end of Phase 1: 5312013.6064215535 3 Lottery conducted and 720.4775162040075 payouts distributed to total 1719 winners. Evil Address lottery winning: 618.0910329738253 Total lottery winnings for public: 102.38648323018857 Total lottery winnings sold by public: 92.14783490716972 Simulating Journey 10 Public mints NFTs using: 2 in journey 10, fuel cells balance: 119864 Evil address mints NFTs using: 25972.0 in journey 10 Total volume in Pool at end of Phase 1: 5937389.8101859465 3 Lottery conducted and 761.7122740557315 payouts distributed to total 1536 winners. Evil Address lottery winning: 631.0055082788696 Total lottery winnings for public: 130.70676577686265 Total lottery winnings sold by public: 117.6360891991764 Simulating Journey 11 Public mints NFTs using: 2 in journey 11, fuel cells balance: 124628 Evil address mints NFTs using: 23374.0 in journey 11 Total volume in Pool at end of Phase 1: 6565651.479225193 3 Lottery conducted and 798.3768733551619 payouts distributed to total 1377 winners. Evil Address lottery winning: 692.2745002077394 Total lottery winnings for public: 106.10237314741761 Total lottery winnings sold by public: 95.49213583267586 Simulating Journey 12 Public mints NFTs using: 0 in journey 12, fuel cells balance: 128792 Evil address mints NFTs using: 21037.0 in journey 12 Total volume in Pool at end of Phase 1: 7199515.825956094 3 Lottery conducted and 831.2080737188694 payouts distributed to total 1230 winners. Evil Address lottery winning: 706.0924333542241 Total lottery winnings for public: 125.11564036465249 Total lottery winnings sold by public: 112.60407632818725 Simulating Journey 13 Public mints NFTs using: 1 in journey 13, fuel cells balance: 132381 Evil address mints NFTs using: 18933.0 in journey 13 Total volume in Pool at end of Phase 1: 7823287.770282013 3 Lottery conducted and 860.3126583254075 payouts distributed to total 1098 winners. Evil Address lottery winning: 729.3517150205965 Total lottery winnings for public: 130.9609433048044 Total lottery winnings sold by public: 117.86484897432396 Simulating Journey 14 Public mints NFTs using: 6 in journey 14, fuel cells balance: 135452 Evil address mints NFTs using: 17040.0 in journey 14 Total volume in Pool at end of Phase 1: 8452504.948955614 3 Lottery conducted and 886.4479873975201 payouts distributed to total 993 winners. Evil Address lottery winning: 770.1423386410055 Total lottery winnings for public: 116.30564875651554 Total lottery winnings sold by public: 104.67508388086398 Simulating Journey 15 Public mints NFTs using: 7 in journey 15, fuel cells balance: 138275 Evil address mints NFTs using: 15336.0 in journey 15 Total volume in Pool at end of Phase 1: 9082026.759713555 3 Lottery conducted and 910.0367540273722 payouts distributed to total 894 winners. Evil Address lottery winning: 790.9379842049984 Total lottery winnings for public: 119.09876982237425 Total lottery winnings sold by public: 107.18889284013683 Simulating Journey 16 Public mints NFTs using: 0 in journey 16, fuel cells balance: 140866 Evil address mints NFTs using: 13802.0 in journey 16 Total volume in Pool at end of Phase 1: 9719855.906450642 3 Lottery conducted and 931.1005219002138 payouts distributed to total 804 winners. Evil Address lottery winning: 809.0052509047749 Total lottery winnings for public: 122.09527099544373 Total lottery winnings sold by public: 109.88574389589935 Simulating Journey 17 Public mints NFTs using: 7 in journey 17, fuel cells balance: 143177 Evil address mints NFTs using: 12422.0 in journey 17 Total volume in Pool at end of Phase 1: 10354604.405719223 3 Lottery conducted and 949.9148964555635 payouts distributed to total 723 winners. Evil Address lottery winning: 813.6496890209258 Total lottery winnings for public: 136.26520743464536 Total lottery winnings sold by public: 122.63868669118082 Simulating Journey 18 Public mints NFTs using: 7 in journey 18, fuel cells balance: 145235 Evil address mints NFTs using: 11180.0 in journey 18 Total volume in Pool at end of Phase 1: 10986496.083216928 3 Lottery conducted and 966.6347183337928 payouts distributed to total 651 winners. Evil Address lottery winning: 850.1803710954314 Total lottery winnings for public: 116.4543472383699 Total lottery winnings sold by public: 104.80891251453292 Simulating Journey 19 Public mints NFTs using: 2 in journey 19, fuel cells balance: 147071 Evil address mints NFTs using: 10062.0 in journey 19 Total volume in Pool at end of Phase 1: 11624076.175803792 3 Lottery conducted and 981.8048161871641 payouts distributed to total 588 winners. Evil Address lottery winning: 830.8129676335983 Total lottery winnings for public: 150.99184855356526 Total lottery winnings sold by public: 135.89266369820874 Simulating Journey 20 Public mints NFTs using: 2 in journey 20, fuel cells balance: 148804 Evil address mints NFTs using: 9055.0 in journey 20 Total volume in Pool at end of Phase 1: 12267863.636429626 3 Lottery conducted and 995.1906878315675 payouts distributed to total 531 winners. Evil Address lottery winning: 867.4785656643211 Total lottery winnings for public: 127.71212216724727 Total lottery winnings sold by public: 114.94090995052255 Simulating Journey 21 Public mints NFTs using: 2 in journey 21, fuel cells balance: 150410 Evil address mints NFTs using: 8150.0 in journey 21 Total volume in Pool at end of Phase 1: 12904372.373817116 3 Lottery conducted and 1007.2859254731237 payouts distributed to total 480 winners. Evil Address lottery winning: 858.8911239525338 Total lottery winnings for public: 148.39480152059423 Total lottery winnings sold by public: 133.5553213685348 Simulating Journey 22 Public mints NFTs using: 2 in journey 22, fuel cells balance: 151867 Evil address mints NFTs using: 7335.0 in journey 22 Total volume in Pool at end of Phase 1: 13540239.64971921 3 Lottery conducted and 1017.9043801682926 payouts distributed to total 429 winners. Evil Address lottery winning: 863.3374812815961 Total lottery winnings for public: 154.5668988866938 Total lottery winnings sold by public: 139.1102089980244 Simulating Journey 23 Public mints NFTs using: 2 in journey 23, fuel cells balance: 153162 Evil address mints NFTs using: 6601.0 in journey 23 Total volume in Pool at end of Phase 1: 14180616.6447528 3 Lottery conducted and 1027.3848895612655 payouts distributed to total 390 winners. Evil Address lottery winning: 798.1990295822125 Total lottery winnings for public: 229.18585997905126 Total lottery winnings sold by public: 206.26727398114613 Simulating Journey 24 Public mints NFTs using: 6 in journey 24, fuel cells balance: 154395 Evil address mints NFTs using: 5941.0 in journey 24 Total volume in Pool at end of Phase 1: 14811028.890169244 3 Lottery conducted and 1035.2597050086183 payouts distributed to total 351 winners. Evil Address lottery winning: 858.2922340669766 Total lottery winnings for public: 176.96747094164417 Total lottery winnings sold by public: 159.27072384747976 Simulating Journey 25 Public mints NFTs using: 0 in journey 25, fuel cells balance: 155468 Evil address mints NFTs using: 5347.0 in journey 25 Total volume in Pool at end of Phase 1: 15449044.748415224 3 Lottery conducted and 1042.5406981504316 payouts distributed to total 315 winners. Evil Address lottery winning: 892.187889981794 Total lottery winnings for public: 150.3528081686338 Total lottery winnings sold by public: 135.31752735177042 Simulating Journey 26 Public mints NFTs using: 4 in journey 26, fuel cells balance: 156459 Evil address mints NFTs using: 4812.0 in journey 26 Total volume in Pool at end of Phase 1: 16083971.477742236 3 Lottery conducted and 1049.2222731915083 payouts distributed to total 288 winners. Evil Address lottery winning: 908.7014330319339 Total lottery winnings for public: 140.52084015957703 Total lottery winnings sold by public: 126.46875614361933 Simulating Journey 27 Public mints NFTs using: 5 in journey 27, fuel cells balance: 157416 Evil address mints NFTs using: 4331.0 in journey 27 Total volume in Pool at end of Phase 1: 16722457.403890578 3 Lottery conducted and 1055.2533766561176 payouts distributed to total 261 winners. Evil Address lottery winning: 911.4339509377925 Total lottery winnings for public: 143.81942571832153 Total lottery winnings sold by public: 129.43748314648937 Simulating Journey 28 Public mints NFTs using: 2 in journey 28, fuel cells balance: 158328 Evil address mints NFTs using: 3898.0 in journey 28 Total volume in Pool at end of Phase 1: 17369204.872122288 3 Lottery conducted and 1060.6564716314247 payouts distributed to total 240 winners. Evil Address lottery winning: 861.7833832005348 Total lottery winnings for public: 198.873088430892 Total lottery winnings sold by public: 178.98577958780282 Simulating Journey 29 Public mints NFTs using: 2 in journey 29, fuel cells balance: 159234 Evil address mints NFTs using: 3508.0 in journey 29 Total volume in Pool at end of Phase 1: 18004778.578933064 3 Lottery conducted and 1065.0662809399128 payouts distributed to total 216 winners. Evil Address lottery winning: 896.0081411081785 Total lottery winnings for public: 169.0581398317323 Total lottery winnings sold by public: 152.15232584855906 Simulating Journey 30 Public mints NFTs using: 4 in journey 30, fuel cells balance: 160074 Evil address mints NFTs using: 3157.0 in journey 30 Total volume in Pool at end of Phase 1: 18637289.03442287 3 Lottery conducted and 1069.1338845470098 payouts distributed to total 195 winners. Evil Address lottery winning: 883.5040452520318 Total lottery winnings for public: 185.6298392949754 Total lottery winnings sold by public: 167.06685536547786 Simulating Journey 31 Public mints NFTs using: 1 in journey 31, fuel cells balance: 160866 Evil address mints NFTs using: 2841.0 in journey 31 Total volume in Pool at end of Phase 1: 19278966.598335568 3 Lottery conducted and 1072.6103195787941 payouts distributed to total 180 winners. Evil Address lottery winning: 822.3345783437409 Total lottery winnings for public: 250.27574123505215 Total lottery winnings sold by public: 225.24816711154693 Simulating Journey 32 Public mints NFTs using: 2 in journey 32, fuel cells balance: 161627 Evil address mints NFTs using: 2557.0 in journey 32 Total volume in Pool at end of Phase 1: 19919503.5785367 3 Lottery conducted and 1075.2231570888864 payouts distributed to total 162 winners. Evil Address lottery winning: 782.2390693106981 Total lottery winnings for public: 292.9840877781887 Total lottery winnings sold by public: 263.6856790003699 Simulating Journey 33 Public mints NFTs using: 4 in journey 33, fuel cells balance: 162356 Evil address mints NFTs using: 2301.0 in journey 33 Total volume in Pool at end of Phase 1: 20569077.07442823 3 Lottery conducted and 1077.129126843361 payouts distributed to total 147 winners. Evil Address lottery winning: 863.5874923671247 Total lottery winnings for public: 213.5416344762349 Total lottery winnings sold by public: 192.1874710286114
Graphs¶
# Generate Graphs
# Convert accumulated data to DataFrames
price_df = pd.DataFrame(prices)
volume_df = pd.DataFrame(volumes)
nfts_minted_df = pd.DataFrame(nfts_minted)
nfts_minted_per_journey_df = pd.DataFrame(nfts_minted_per_journey)
evil_address_balance_df = pd.DataFrame(evil_address_balances)
yields_df = pd.DataFrame(yields_per_journey)
yields_accumulated_df = pd.DataFrame(yields_per_journey_accumulated)
cumulative_yield_df = pd.DataFrame(cumulative_yield_per_journey_1)
yield_per_nft_df = pd.DataFrame(yield_per_nft_per_journey)
pool_dark_reserve_df = pd.DataFrame(pool_dark_reserves)
pool_dai_reserve_df = pd.DataFrame(pool_dai_reserves)
token_distribution_df = pd.DataFrame(token_distribution)
evil_address_balance_df.to_csv("./EvilAddressbalanceChange.csv")
Token Distribution¶
# Plot Token distribution among the accounts across the journeys in a stacked area chart
fig = go.Figure()
fig.add_trace(go.Scatter(x=token_distribution_df['journey'] + token_distribution_df['phase'] / 3, y=token_distribution_df['magic_box_balance'], mode='lines', stackgroup='one', name='Magic Box Account', hoverinfo='x+y'))
fig.add_trace(go.Scatter(x=token_distribution_df['journey'] + token_distribution_df['phase'] / 3, y=token_distribution_df['pool_balance'], mode='lines', stackgroup='one', name='Pool', hoverinfo='x+y'))
fig.add_trace(go.Scatter(x=token_distribution_df['journey'] + token_distribution_df['phase'] / 3, y=token_distribution_df['treasury_balance'], mode='lines', stackgroup='one', name='Treasury Account', hoverinfo='x+y'))
fig.add_trace(go.Scatter(x=token_distribution_df['journey'] + token_distribution_df['phase'] / 3, y=token_distribution_df['jackpot_balance'], mode='lines', stackgroup='one', name='Jackpot Account', hoverinfo='x+y'))
fig.add_trace(go.Scatter(x=token_distribution_df['journey'] + token_distribution_df['phase'] / 3, y=token_distribution_df['evil_address_balance'], mode='lines', stackgroup='one', name='Evil Address Account', hoverinfo='x+y'))
fig.add_trace(go.Scatter(x=token_distribution_df['journey'] + token_distribution_df['phase'] / 3, y=token_distribution_df['public_balance'], mode='lines', stackgroup='one', name='Public Account', hoverinfo='x+y'))
fig.add_trace(go.Scatter(x=token_distribution_df['journey'] + token_distribution_df['phase'] / 3, y=token_distribution_df['team_balance'], mode='lines', stackgroup='one', name='Team Account', hoverinfo='x+y'))
fig.add_trace(go.Scatter(x=token_distribution_df['journey'] + token_distribution_df['phase'] / 3, y=token_distribution_df['yield_balance'], mode='lines', stackgroup='one', name='Yield', hoverinfo='x+y'))
fig.update_layout(title='Token Distribution Among Accounts Across Journeys and Their Phase', xaxis_title='Journey and Phase', yaxis_title='Token Balance')
fig.show()
Price of Dark Tokens over Journey¶
# Plot Price of Dark token across journeys and their phase
fig = go.Figure()
fig.add_trace(go.Scatter(x=price_df['journey'] + price_df['phase'] / 3, y=price_df['price'], mode='lines+markers', name='Price of Dark Token'))
fig.update_layout(title='Price of Dark Token Across Journeys and Their Phase', xaxis_title='Journey and Phase', yaxis_title='Price of Dark Token')
fig.show()
Total Number of NFTs minted over Journeys¶
# Plot Total number of NFTs minted over journey
fig = go.Figure()
fig.add_trace(go.Bar(x=nfts_minted_df['journey'], y=nfts_minted_df['nfts'], name='Total NFTs Minted'))
fig.update_layout(title='Total Number of NFTs Minted over journey', xaxis_title='Journey', yaxis_title='Total NFTs Minted')
fig.show()
Total Number of NFTs minted in each journey¶
# Plot Number of NFTs minted in each journey
fig = go.Figure()
fig.add_trace(go.Bar(x=nfts_minted_per_journey_df['journey'], y=nfts_minted_per_journey_df['nftsMinted'], name='Total NFTs Minted'))
fig.update_layout(title='Total Number of NFTs Minted in Each Journey', xaxis_title='Journey', yaxis_title='Total NFTs Minted')
fig.show()
Cummulative yield per NFT minted in Journey 1 in DARK tokens¶
# Plot Cumulative yield per journey for NFTs minted in journey 1
fig = go.Figure()
fig.add_trace(go.Scatter(x=cumulative_yield_df['journey'], y=cumulative_yield_df['total_yield'], mode='lines+markers', name='Cumulative Yield for NFTs Minted in Journey 1'))
fig.update_layout(title='Cumulative Yield for NFTs Minted in Journey 1', xaxis_title='Journey', yaxis_title='Cumulative Yield (DARK)')
fig.show()
Cummulative yield per NFT minted in Journey 1 in USD¶
# Plot Cumulative yield per journey for NFTs minted in journey 1
# Filtering df1 where phase == 3
df1_phase3 = price_df[price_df['phase'] == 3]
# Merging df1_phase3 with df2 on 'journey'
merged_df = pd.merge(df1_phase3, cumulative_yield_df, on='journey')
# Creating the new DataFrame with the required calculation
result_df = pd.DataFrame({
'journey': merged_df['journey'],
'total_yield_usd': merged_df['price'] * merged_df['total_yield']
})
fig = go.Figure()
fig.add_trace(go.Scatter(x=result_df['journey'], y=result_df['total_yield_usd'], mode='lines+markers', name='Cumulative Yield for NFTs Minted in Journey 1 in USD'))
fig.update_layout(title='Cumulative Yield for NFTs Minted in Journey 1', xaxis_title='Journey', yaxis_title='Cumulative Yield (USD)')
fig.show()
Return on Investment¶
# Plot Cumulative yield per journey for NFTs minted in journey 1
# Creating the new DataFrame with the required calculation
price_value = price_df[(price_df['journey'] == 0) & (price_df['phase'] == 1)]['price'].values[0]
roi_df = pd.DataFrame({
'journey': result_df['journey'],
'roi': result_df['total_yield_usd'] / price_value * 100
})
fig = go.Figure()
fig.add_trace(go.Scatter(x=roi_df['journey'], y=roi_df['roi'], mode='lines+markers', name='Return on Investment in Journey 1'))
fig.update_layout(title='Cumulative Yield for NFTs Minted in Journey 1', xaxis_title='Journey', yaxis_title='ROI (%)')
fig.show()
Cummulative yield given to NFTs till Journey 50¶
# Plot Total yield generated by NFT minted in each journey
fig = go.Figure()
fig.add_trace(go.Bar(x=yields_accumulated_df['journey'], y=yields_accumulated_df['total_yield'], name='Total Yield Generated'))
fig.update_layout(title='Total Yield Generated by NFTs Minted in Each Journey', xaxis_title='Journey', yaxis_title='Total Yield')
fig.show()
Change of Balance of Evil Address over journeys¶
# Plot Change of balance of Evil address across each journey and their phase
fig = go.Figure()
fig.add_trace(go.Scatter(x=evil_address_balance_df['journey'] + evil_address_balance_df['phase'] / 3, y=evil_address_balance_df['balance'], mode='lines+markers', name='Evil Address Balance'))
fig.update_layout(title='Change of Balance of Evil Address Across Each Journey and Their Phase', xaxis_title='Journey and Phase', yaxis_title='Balance of Evil Address')
fig.show()
Expected Liquidity Pool trades¶
# Plot Cumulative volume of trades across phases and journey
fig = go.Figure()
fig.add_trace(go.Scatter(x=volume_df['journey'] + volume_df['phase'] / 3, y=volume_df['volume'], mode='lines+markers', name='Cumulative Volume'))
fig.update_layout(title='Cumulative Volume of Trades Across Phases and Journey', xaxis_title='Journey and Phase', yaxis_title='Cumulative Volume')
fig.show()
# Plot Change in Dark token reserves in the pool
fig = go.Figure()
fig.add_trace(go.Scatter(x=pool_dark_reserve_df['journey'] + pool_dark_reserve_df['phase'] / 3, y=pool_dark_reserve_df['dark_reserve'], mode='lines+markers', name='Dark Reserve in Pool'))
fig.update_layout(title='Change in Dark Token Reserves in the Pool Across Journeys and Their Phase', xaxis_title='Journey and Phase', yaxis_title='Dark Token Reserve')
fig.show()
# Plot Change in DAI token reserves in the pool
fig = go.Figure()
fig.add_trace(go.Scatter(x=pool_dai_reserve_df['journey'] + pool_dai_reserve_df['phase'] / 3, y=pool_dai_reserve_df['dai_reserve'], mode='lines+markers', name='DAI Reserve in Pool'))
fig.update_layout(title='Change in DAI Token Reserves in the Pool Across Journeys and Their Phase', xaxis_title='Journey and Phase', yaxis_title='DAI Token Reserve')
fig.show()